/*
 * Copyright (C) 2018 Zhejiang xiaominfo Technology CO.,LTD.
 * All rights reserved.
 * Official Web Site: http://www.xiaominfo.com.
 * Developer Web Site: http://open.xiaominfo.com.
 */

package com.github.xiaoymin.map.request.amap;

import cn.hutool.core.map.MapUtil;
import cn.hutool.core.util.StrUtil;
import com.github.xiaoymin.map.exception.MapClientException;

import java.util.HashMap;
import java.util.Map;

/**
 * 行政区划查询
 * @author <a href="mailto:xiaoymin@foxmail.com">xiaoymin@foxmail.com</a>
 * 2020/09/23 19:07
 * @since:map-client 1.0
 */
public class AmapDistrictRequest {

    /**
     * 关键字
     * 只支持单个关键词语搜索关键词支持：行政区名称、citycode、adcode
     * 例如，在subdistrict=2，搜索省份（例如山东），能够显示市（例如济南），区（例如历下区）
     */
    private String keywords;
    /**
     * 子级行政区
     * 规则：设置显示下级行政区级数（行政区级别包括：国家、省/直辖市、市、区/县、乡镇/街道多级数据）
     * 可选值：0、1、2、3等数字，并以此类推
     * 0：不返回下级行政区；
     * 1：返回下一级行政区；
     * 2：返回下两级行政区；
     * 3：返回下三级行政区；
     * 需要在此特殊说明，目前部分城市和省直辖县因为没有区县的概念，故在市级下方直接显示街道。
     * 例如：广东-东莞、海南-文昌市
     */
    private int subdistrict=0;
    /**
     * 页码
     */
    private int page=1;
    /**
     * offset大小
     */
    private int offset=20;
    /**
     * 返回结果控制
     */
    private AmapExtension amapExtension=AmapExtension.base;
    /**
     * 根据区划过滤
     */
    private String filter;

    public AmapDistrictRequest(String keywords, int subdistrict, int page, int offset, AmapExtension amapExtension, String filter) {
        this.keywords = keywords;
        this.subdistrict = subdistrict;
        this.page = page;
        this.offset = offset;
        this.amapExtension = amapExtension;
        this.filter = filter;
    }

    public static class Builder{

        /**
         * 关键字
         * 只支持单个关键词语搜索关键词支持：行政区名称、citycode、adcode
         * 例如，在subdistrict=2，搜索省份（例如山东），能够显示市（例如济南），区（例如历下区）
         */
        private String keywords;
        /**
         * 子级行政区
         * 规则：设置显示下级行政区级数（行政区级别包括：国家、省/直辖市、市、区/县、乡镇/街道多级数据）
         * 可选值：0、1、2、3等数字，并以此类推
         * 0：不返回下级行政区；
         * 1：返回下一级行政区；
         * 2：返回下两级行政区；
         * 3：返回下三级行政区；
         * 需要在此特殊说明，目前部分城市和省直辖县因为没有区县的概念，故在市级下方直接显示街道。
         * 例如：广东-东莞、海南-文昌市
         */
        private int subdistrict=0;
        /**
         * 页码
         */
        private int page=1;
        /**
         * offset大小
         */
        private int offset=20;
        /**
         * 返回结果控制
         */
        private AmapExtension amapExtension=AmapExtension.base;
        /**
         * 根据区划过滤
         */
        private String filter;

        public Builder keywords(String keywords){
            this.keywords=keywords;
            return this;
        }

        public Builder subdistrict(int subdistrict){
            if (subdistrict>3){
                this.subdistrict=3;
            }else{
                this.subdistrict=subdistrict;
            }
            return this;
        }

        public Builder page(int page){
            if (page<1){
                this.page=1;
            }else{
                this.page=page;
            }
            return this;
        }

        public Builder offset(int offset){
            if (offset<1){
                this.offset=20;
            }else{
                this.offset=offset;
            }
            return this;
        }

        public Builder extension(AmapExtension amapExtension){
            this.amapExtension=amapExtension;
            return this;
        }
        public Builder filter(String filter){
            this.filter=filter;
            return this;
        }

        public AmapDistrictRequest build(){
            return new AmapDistrictRequest(keywords,subdistrict,page,offset,amapExtension,filter);
        }

    }

    public Map<String,String> toMap(){
        Map<String,String> param=MapUtil.builder("keywords",this.keywords)
                .put("subdistrict",String.valueOf(this.subdistrict))
        .put("extensions",amapExtension.name())
        .put("page",String.valueOf(this.page))
        .put("offset",String.valueOf(this.offset)).build();
        if (StrUtil.isNotBlank(filter)){
            param.put("filter",this.filter);
        }
        return param;
    }


    public String getKeywords() {
        return keywords;
    }

    public void setKeywords(String keywords) {
        this.keywords = keywords;
    }

    public int getSubdistrict() {
        return subdistrict;
    }

    public void setSubdistrict(int subdistrict) {
        this.subdistrict = subdistrict;
    }

    public int getPage() {
        return page;
    }

    public void setPage(int page) {
        this.page = page;
    }

    public int getOffset() {
        return offset;
    }

    public void setOffset(int offset) {
        this.offset = offset;
    }

    public AmapExtension getAmapExtension() {
        return amapExtension;
    }

    public void setAmapExtension(AmapExtension amapExtension) {
        this.amapExtension = amapExtension;
    }

    public String getFilter() {
        return filter;
    }

    public void setFilter(String filter) {
        this.filter = filter;
    }
}
